home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / RAND / BM132A.LZH / bm_132a / engine.s < prev    next >
Encoding:
Text File  |  1995-11-27  |  9.4 KB  |  300 lines

  1. *=======================================================*
  2. *    Display-engine module: latest update 27/11/95    *
  3. *=======================================================*
  4. *    Call all display modules in correct order    *
  5. *=======================================================*
  6. *     >    New 68030 module by Douglas Little.        *
  7. *=======================================================*
  8.  
  9. lighting_effects    ; enable for light & shadows
  10.  
  11. *-------------------------------------------------------*
  12. display_engine:
  13. *-------------------------------------------------------*
  14. *    Calculate window base-address (centering)    *
  15. *-------------------------------------------------------*
  16.     move.l        ScreenLog,d0
  17.     move.w        scrwidth,d1
  18.     sub.w        width,d1
  19.     lsr.w        d1
  20.     ext.l        d1
  21.     add.l        d1,d1
  22.     add.l        d1,d0
  23.     move.l        d0,screen
  24. *-------------------------------------------------------*
  25. *    Reset wall & floor buffers for this frame    *
  26. *-------------------------------------------------------*
  27.     bsr        init_wall_lists
  28.     bsr        init_floor_lists
  29. *-------------------------------------------------------*
  30.     ifd        dsp
  31. *-------------------------------------------------------*
  32.     dspwrite.l    #clear_command
  33. *-------------------------------------------------------*
  34.     endc
  35. *-------------------------------------------------------*
  36. *    Init display variables for this frame        *
  37. *-------------------------------------------------------*
  38.     bsr        update_display_struct
  39. *-------------------------------------------------------*
  40. *    Init lighting effects for this frame        *    
  41. *-------------------------------------------------------*    
  42.     bsr        set_lighting
  43. *-------------------------------------------------------*
  44. *    Clearscreen for resizing window & debugging    *
  45. *-------------------------------------------------------*
  46. ;    move.b        #1,refresh
  47.     move.l        ScreenLog,a0
  48.     bsr        clearscreen
  49. *-------------------------------------------------------*
  50. *    Descend BSP tree & build scenery        *
  51. *-------------------------------------------------------*
  52.     bsr        descend_bsp
  53. *-------------------------------------------------------*
  54. *    Render floors & ceilings onto framebuffer    *
  55. *-------------------------------------------------------*
  56.     bsr        render_flats
  57. *-------------------------------------------------------*
  58. *    Render walls onto framebuffer            *
  59. *-------------------------------------------------------*
  60.     bsr        render_walls
  61. *-------------------------------------------------------*
  62.     rts
  63.  
  64. *-------------------------------------------------------*
  65. *    Init wall edgebuffer lists             *
  66. *-------------------------------------------------------*
  67. init_wall_lists:
  68. *-------------------------------------------------------*
  69.     lea        maxy,a0
  70.     lea        miny,a1
  71.     lea        occlusion_list,a2
  72.     move.w        height,d1
  73.     moveq        #0,d2
  74.     moveq        #-1,d3
  75.     move.w        width,d0
  76.     subq.w        #1,d0
  77. .for_i:    move.w        d1,(a0)+
  78.     move.w        d2,(a1)+
  79.     move.b        d3,(a2)+
  80.     dbra        d0,.for_i
  81.     clr.w        wallruncount
  82.     move.w        width,columns
  83.     rts
  84.  
  85. *-------------------------------------------------------*
  86. *    Init floor edgebuffer lists            *
  87. *-------------------------------------------------------*
  88. init_floor_lists:
  89. *-------------------------------------------------------*
  90.     lea        flatruncounts,a0
  91.     moveq        #0,d1
  92.     move.w        height,d0
  93.     subq.w        #1,d0
  94. .clr:    move.w        d1,(a0)+
  95.     dbra        d0,.clr
  96.     rts
  97.  
  98. *-------------------------------------------------------*
  99. *    Set up general (engine) structures & tables    *
  100. *-------------------------------------------------------*
  101. init_engine:
  102. *-------------------------------------------------------*
  103.     lea        display_struct,a6
  104. *-------------------------------------------------------*
  105. *    Initialise pointers to WAD room data        *
  106. *-------------------------------------------------------*
  107.     move.l        PNode_Array,display_nodes(a6)
  108.     move.l        Seg_Array,display_segs(a6)
  109.     move.l        Sector_Array,display_sectors(a6)
  110.     move.l        SSector_Array,display_ssectors(a6)
  111.     move.l        Side_Array,display_sidedefs(a6)
  112.     move.l        Line_Array,display_linedefs(a6)
  113.     move.l        Vertex_Array,display_vertices(a6)
  114. *-------------------------------------------------------*
  115. *    Create transparent (glass) translation table    *
  116. *-------------------------------------------------------*
  117.     bsr        init_glass
  118.     rts
  119.  
  120. *-------------------------------------------------------*
  121. *    Update general (engine) display structure    *
  122. *-------------------------------------------------------*
  123. update_display_struct:
  124. *-------------------------------------------------------*
  125.     lea        display_struct,a6
  126. *-------------------------------------------------------*
  127. *    Set up player position and angle        *
  128. *-------------------------------------------------------*
  129.     move.l        SinPangle,d3
  130.     move.l        CosPangle,d4
  131.     asr.l        #2,d3
  132.     asr.l        #2,d4
  133.     move.w        d3,display_sina(a6)
  134.     move.w        d4,display_cosa(a6)
  135.     move.w        Px,display_px(a6)
  136.     move.w        Py,display_py(a6)
  137. *-------------------------------------------------------*
  138. *    Calculate base address of octant routine    *
  139. *-------------------------------------------------------*
  140.     move.w        Pangle,d7
  141.     moveq        #(16-3),d0
  142.     lsr.w        d0,d7
  143.     lea        octs,a0
  144.     move.w        (a0,d7.w*2),display_octant(a6)
  145. *-------------------------------------------------------*
  146.     move.w        #1,first_ssector
  147. *-------------------------------------------------------*
  148.     rts
  149.     
  150. *-------------------------------------------------------*
  151. *    Select new display window size            *
  152. *-------------------------------------------------------*
  153. select_window:
  154. *-------------------------------------------------------*
  155.     pushall
  156.     moveq        #10,d1
  157.     move.w        window_size,d2
  158.     cmp.w        #256,d2
  159.     bpl.s        .ok1
  160.     move.w        #256,d2
  161. .ok1    cmp.w        #1<<10,d2
  162.     bmi.s        .ok2
  163.     move.w        #1<<10,d2
  164. .ok2:    move.w        d2,window_size
  165. *-------------------------------------------------------*
  166.     move.w        d2,d0
  167.     mulu.w        #max_width,d0
  168.     lsr.l        d1,d0
  169.     move.w        d0,width
  170. *-------------------------------------------------------*
  171.     move.w        d2,d0
  172.     mulu.w        #max_height,d0
  173.     lsr.l        d1,d0
  174.     move.w        d0,height
  175. *-------------------------------------------------------*
  176. *    Update global display structure            *
  177. *-------------------------------------------------------*
  178.     lea        display_struct,a6
  179.     move.w        width,d1
  180.     move.w        d1,display_width(a6)
  181.     lsr.w        d1
  182.     move.w        d1,display_shwid(a6)
  183. *-------------------------------------------------------*
  184. *    Update addwall structure            *
  185. *-------------------------------------------------------*
  186.     lea        addwall_struct,a6
  187.     move.w        width,addwall_xsize(a6)
  188.     move.w        height,addwall_ysize(a6)
  189. *-------------------------------------------------------*
  190. *    3 CLS calls required to wipe log, phys & bak    *
  191. *-------------------------------------------------------*
  192.     move.b        #3,refresh
  193. *-------------------------------------------------------*
  194. *    Recalculate video display height        *
  195. *-------------------------------------------------------*
  196.     move.b        #1,adjust
  197. *-------------------------------------------------------*
  198. *    Resize DSP rendering zone            *
  199. *-------------------------------------------------------*
  200.     ifd        dsp
  201. *-------------------------------------------------------*
  202.     dspwrite.l    #resize_command
  203.     moveq        #0,d0
  204.     move.w        width,d0
  205.     dspwrite.l    d0
  206.     move.w        height,d0
  207.     dspwrite.l    d0
  208. *-------------------------------------------------------*
  209.     endc
  210. *-------------------------------------------------------*
  211.     popall
  212.     rts
  213.         
  214. *-------------------------------------------------------*
  215. clearscreen:
  216. *-------------------------------------------------------*
  217.     tst.b        refresh
  218.     bne.s        .go
  219.     rts
  220. .go:    subq.b        #1,refresh
  221.     move.w        #(320*200)/2,d0
  222. *-------------------------------------------------------*
  223. clearlongs:
  224. *-------------------------------------------------------*
  225.     moveq        #0,d1
  226.     move.l        d1,d2
  227.     move.l        d2,d3
  228.     move.l        d2,d4
  229.     move.l        d2,d5
  230.     move.l        d2,d6
  231.     move.l        d2,d7
  232.     move.l        d2,a2
  233.     move.l        d2,a3
  234.     moveq        #128-1,d1
  235.     and.l        d0,d1
  236.     bra.s        .strt
  237. .long    move.l        d2,(a0)+
  238. .strt    dbra        d1,.long
  239.     lsr.l        #7,d0
  240.     move.l        d0,d1
  241.     lsl.l        #8,d1                ; *256
  242.     lsl.l        #1,d1                ; *2    =  *512
  243.     add.l        d1,a0
  244.     bra.s        .next
  245. .clr    movem.l        d2-d7/a2-a3,-(a0)        ; 4*8*16 = 512
  246.     movem.l        d2-d7/a2-a3,-(a0)
  247.     movem.l        d2-d7/a2-a3,-(a0)
  248.     movem.l        d2-d7/a2-a3,-(a0)
  249.     movem.l        d2-d7/a2-a3,-(a0)
  250.     movem.l        d2-d7/a2-a3,-(a0)
  251.     movem.l        d2-d7/a2-a3,-(a0)
  252.     movem.l        d2-d7/a2-a3,-(a0)
  253.     movem.l        d2-d7/a2-a3,-(a0)
  254.     movem.l        d2-d7/a2-a3,-(a0)
  255.     movem.l        d2-d7/a2-a3,-(a0)
  256.     movem.l        d2-d7/a2-a3,-(a0)
  257.     movem.l        d2-d7/a2-a3,-(a0)
  258.     movem.l        d2-d7/a2-a3,-(a0)
  259.     movem.l        d2-d7/a2-a3,-(a0)
  260.     movem.l        d2-d7/a2-a3,-(a0)
  261. .next    dbra        d0,.clr
  262.     rts
  263.  
  264. *-------------------------------------------------------*
  265. *    Doom engine subroutines                *
  266. *-------------------------------------------------------*
  267.  
  268. *-------------------------------------------------------*
  269.     ifd        dsp
  270. *-------------------------------------------------------*
  271.     include        dspwalls.s
  272. *-------------------------------------------------------*
  273.     elseif
  274. *-------------------------------------------------------*
  275.     include        addwall.s
  276. *-------------------------------------------------------*
  277.     endc
  278. *-------------------------------------------------------*
  279.  
  280.     include        bspd.s
  281.     include        render.s
  282.     include        lighting.s
  283.     include        timing.s
  284.     include        tables.s
  285.     
  286. *-------------------------------------------------------*
  287.         bss
  288. *-------------------------------------------------------*
  289.  
  290. window_size:        ds.w    1
  291.  
  292. width:            ds.w    1
  293. height:            ds.w    1
  294.  
  295. display_struct:        ds.b    display_len
  296.  
  297. *-------------------------------------------------------*
  298.         text
  299. *-------------------------------------------------------*
  300.